<%@page import="java.util.ArrayList"%>
<%@ page pageEncoding="UTF-8" %>
<%@ page import="util.*" %>
<%@ page import="entidades.*" %>
<%@ page import="comparator.*" %>

<%@ page import="java.util.Map" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.Collections" %>
<%@ page import="com.google.gson.Gson" %>
<%@ page import="com.google.gson.JsonObject" %>
<%@ page import="com.google.gson.reflect.TypeToken" %>
<%@ page import="java.lang.reflect.Type" %>
<%@ page import="java.util.Calendar" %>
<%
String svc = request.getParameter("service");
if(svc != null)
    {
	String resultado = "";

	try{
		// El servicio 'estimar-ordenes' devuelve una lista de posibles fechas de entrega para varias ordenes.
		if(svc.compareTo("estimar-ordenes") == 0)
			{			
			// Obtengo los datos de la orden de venta.
                        Boolean soloImpresion = Boolean.parseBoolean(request.getParameter("soloImpresion"));
			OrdenVenta ov = new OrdenVenta();
			ov.setBarniz(Boolean.parseBoolean(request.getParameter("barniz")));
			ov.setInterior(Boolean.parseBoolean(request.getParameter("interior")));
			ov.setCantidadColores(Integer.parseInt(request.getParameter("cantidad_colores")));
			ov.setLacaUvId(Integer.parseInt(request.getParameter("laca_uv_id")));
			ov.setPaisId(request.getParameter("pais_id"));
			
			// Obtengo la lista de ordenes.
			String json = request.getParameter("ordenes");
			Gson gson = new Gson();
			Type tipo = new TypeToken<List<Map<String,String>>>(){}.getType();
			List<Map<String,String>> ordenes = gson.fromJson(json, tipo);

			// Por cada orden, obtengo la lista de fechas posibles.
			Map<String, List<Map>> fechasPosibles = new HashMap();
			for(int i=0, n=ordenes.size(); i<n; i++)
				{
				Map<String,String> orden = ordenes.get(i);

				OrdenTrabajo p = new OrdenTrabajo();
				p.setFormatoId(orden.get("formato_id"));
				p.setCantidad(orden.get("cantidad"));
				p.calcularMetros();
				p.setOrdenVenta(ov);
                                if (!soloImpresion){
                                    fechasPosibles.put(orden.get("ot"), p.calcularFechasPosiblesSoloReprogramar());
                                }else{
                                    fechasPosibles.put(orden.get("ot"), p.calcularFechasPosiblesSoloImpresion());
                                    }
                          }

		
			// Imprimo el resultado.
			resultado = Json.getOkMsj("fechasPosibles", fechasPosibles);
                        
			}
		
		
		// El servicio 'cambiar-impresion' devuelve una lista de posibles semanas de impresion para una orden.
		if(svc.compareTo("cambiar-impresion") == 0)
			{
			OrdenTrabajo p = new OrdenTrabajo(request.getParameter("pedido_id"));
			boolean planificados = request.getParameter("planificado") != null && request.getParameter("planificado").compareTo("true") == 0;
			Date fecha = (request.getParameter("fecha") == null || request.getParameter("fecha").length() == 0)? p.getCicloNewlongInicio() : Util.parseDatetime(request.getParameter("fecha"));
			
			List<CicloUteco> ciclosAux = CicloUteco.listarDisponibles(fecha, p, true, planificados);
			List<Map> ciclos = new LinkedList();
			
			for(int i=0,n=ciclosAux.size(); i<n; i++)
				{
				Map map = new HashMap();
				CicloUteco cu = ciclosAux.get(i);
				map.put("id", cu.getId());
				map.put("utecoId", cu.getUtecoId());
				map.put("numero", cu.getNumero());
				map.put("planificado", cu.isPlanificado());
				map.put("bloqueado", cu.isBloqueado());
				map.put("fechaHoraInicio", cu.getFechaHoraInicioToString());
				map.put("fechaHoraFin", cu.getFechaHoraFinToString());
				map.put("capacidad", cu.getCapacidad());
				map.put("capacidadDisponible", cu.getCapacidadDisponible());
				map.put("porcentajeDisponible", cu.getPorcentajeDisponible());
				ciclos.add(map);
				}
			
			resultado = Json.getOkMsj("ciclosImpresion", ciclos);
			}
		
		
		// El servicio 'cambiar-confeccion' devuelve una lista de posibles semanas de confeccion para una orden.
		if(svc.compareTo("cambiar-confeccion") == 0)
			{
			OrdenTrabajo p = new OrdenTrabajo(request.getParameter("pedido_id"));
			boolean planificado = request.getParameter("planificado") != null && request.getParameter("planificado").compareTo("true") == 0;
			Calendar fechaFiltro = Calendar.getInstance();
                        fechaFiltro.add(Calendar.DATE, Tiempos.getDiasEspera());
			List<Map> fechasPosibles = CicloNewlong.fechasPosiblesSoloReprogramar(p.getFormatoId(), p.getCantidad(), new Date(), planificado);
			List<Map> fechas = new ArrayList<Map>();
                        for(int i=0,n=fechasPosibles.size(); i<n; i++)
				{
                                int idPais = ((Integer) fechasPosibles.get(i).get("paisId")).intValue();
                                if (p.getOrdenVenta().getPais().getId() == idPais
                                        && ((Date)fechasPosibles.get(i).get("fechaHoraInicio")).compareTo(fechaFiltro.getTime()) > 0){
                                    Date fechaHoraInicio = (Date) fechasPosibles.get(i).get("fechaHoraInicio");
                                    Date fechaHoraFin = (Date) fechasPosibles.get(i).get("fechaHoraFin");
				
                                    fechasPosibles.get(i).put("superaPrometida", p.getFechaPrometida().getTime() <= fechaHoraFin.getTime());
                                    fechasPosibles.get(i).put("fechaHoraInicio", Util.format(fechaHoraInicio, "dd/MM/yyyy HH:mm:ss"));
                                    fechasPosibles.get(i).put("fechaHoraFin", Util.format(fechaHoraFin, "dd/MM/yyyy HH:mm:ss"));
                                    fechas.add(fechasPosibles.get(i));
                                    }
				}
			
			resultado = Json.getOkMsj("ciclosConfeccion",  fechas);
			}
		
		
		}catch(Exception e)
			{ resultado = Json.getErrorMsj(e); e.printStackTrace(); }

	out.print(resultado);
    }
%>
